#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
策略配置文件模板

说明：
1. 将此文件复制为 config.py 并根据实际情况修改参数
2. 所有参数都有详细的注释说明
3. 建议先使用模拟交易测试参数设置
"""

# =============================================================================
# 基础配置
# =============================================================================

# 交易账户配置
ACCOUNT_CONFIG = {
    # TQ SDK 账户配置
    'TQ_USER_ID': 'your_user_id',           # TQ用户ID
    'TQ_PASSWORD': 'your_password',          # TQ密码
    'TQ_BROKER_ID': 'your_broker_id',       # 经纪商ID
    'TQ_APP_ID': 'your_app_id',             # 应用ID
    'TQ_AUTH_CODE': 'your_auth_code',       # 授权码
    
    # 交易模式
    'TRADE_MODE': 'SIMULATION',             # 交易模式: SIMULATION(模拟) / REAL(实盘)
    'SIMULATION_BALANCE': 100000,           # 模拟账户初始资金(元)
    
    # 日志配置
    'LOG_LEVEL': 'INFO',                    # 日志级别: DEBUG/INFO/WARNING/ERROR
    'LOG_FILE': 'trading.log',              # 日志文件路径
}

# =============================================================================
# 策略核心参数
# =============================================================================

# 技术指标参数
TECHNICAL_INDICATORS = {
    # 移动平均线参数
    'MA_SHORT': 5,                          # 短期均线周期
    'MA_LONG': 20,                          # 长期均线周期
    
    # MACD参数
    'MACD_FAST': 12,                        # 快速EMA周期
    'MACD_SLOW': 26,                        # 慢速EMA周期
    'MACD_SIGNAL': 9,                       # 信号线周期
    
    # RSI参数
    'RSI_PERIOD': 14,                       # RSI计算周期
    'RSI_OVERBOUGHT': 70,                   # RSI超买阈值
    'RSI_OVERSOLD': 30,                     # RSI超卖阈值
    
    # 布林带参数
    'BOLL_PERIOD': 20,                      # 布林带周期
    'BOLL_STD': 2,                          # 标准差倍数
}

# 交易信号参数
TRADING_SIGNALS = {
    # 趋势信号
    'TREND_CONFIRMATION_BARS': 3,           # 趋势确认所需K线数量
    'MIN_TREND_STRENGTH': 0.02,             # 最小趋势强度(2%)
    
    # 反转信号
    'REVERSAL_CONFIRMATION': 2,             # 反转确认所需信号数
    'PRICE_DIVERGENCE_THRESHOLD': 0.01,     # 价格背离阈值(1%)
    
    # 信号过滤
    'SIGNAL_FILTER_WINDOW': 5,              # 信号过滤窗口大小
    'MIN_SIGNAL_STRENGTH': 0.5,             # 最小信号强度(0-1)
}

# =============================================================================
# 资金管理参数
# =============================================================================

# 仓位管理
POSITION_MANAGEMENT = {
    # 单品种分散因子
    'SINGLE_POSITION_DIVERSIFICATION_FACTOR': 3,  # 单品种最大仓位分散因子
    
    # 最大持仓比例
    'MAX_POSITION_RATIO': 0.3,              # 单品种最大持仓比例(30%)
    'TOTAL_MAX_POSITION_RATIO': 0.8,        # 总最大持仓比例(80%)
    
    # 最小交易单位
    'MIN_TRADE_VOLUME': 1,                  # 最小交易手数
    'VOLUME_ROUNDING': 'down',              # 手数取整方式: down/nearest
}

# 风险控制参数
RISK_CONTROL = {
    # 止损参数
    'STOP_LOSS_RATIO': 0.05,                # 止损比例(5%)
    'TRAILING_STOP_RATIO': 0.03,            # 移动止损比例(3%)
    'STOP_LOSS_ACTIVATION_BARS': 2,         # 止损激活所需K线数
    
    # 止盈参数
    'TAKE_PROFIT_RATIO': 0.15,              # 止盈比例(15%)
    'PROFIT_PROTECTION_RATIO': 0.08,        # 利润保护比例(8%)
    
    # 动态风险调整
    'VOLATILITY_ADJUSTMENT': True,          # 是否根据波动率调整风险参数
    'VOLATILITY_LOOKBACK': 20,              # 波动率计算回溯周期
}

# =============================================================================
# 品种管理参数
# =============================================================================

# 品种选择标准
SYMBOL_SELECTION = {
    # 流动性要求
    'MIN_DAILY_VOLUME': 10000,              # 最小日均成交量
    'MIN_OPEN_INTEREST': 5000,              # 最小持仓量
    'MAX_BID_ASK_SPREAD': 0.002,            # 最大买卖价差比例
    
    # 波动性要求
    'MIN_ANNUAL_VOLATILITY': 0.15,          # 最小年化波动率(15%)
    'MAX_ANNUAL_VOLATILITY': 0.50,          # 最大年化波动率(50%)
    
    # 相关性控制
    'MAX_AVG_CORRELATION': 0.3,             # 最大平均相关性
    'MAX_PAIR_CORRELATION': 0.7,            # 最大品种对相关性
}

# 品种配置
SYMBOL_CONFIG = {
    # 交易所配置
    'EXCHANGES': ['SHFE', 'DCE', 'CZCE', 'INE'],  # 支持的交易所
    
    # 品种列表(可根据需要添加或删除)
    'SYMBOLS': [
        # 黑色系
        'rb', 'hc', 'i', 'jm', 'j',
        # 有色金属
        'cu', 'al', 'zn', 'pb', 'ni', 'sn',
        # 贵金属
        'au', 'ag',
        # 能源化工
        'sc', 'fu', 'bu', 'ru', 'ma', 'TA', 'pp', 'v', 'eg',
        # 农产品
        'a', 'b', 'm', 'y', 'p', 'c', 'cs', 'jd', 'cf', 'sr', 'oi', 'rm'
    ],
    
    # 品种权重(可选，不设置则平均分配)
    'SYMBOL_WEIGHTS': {
        # 'rb': 0.1,    # 螺纹钢权重10%
        # 'cu': 0.08,   # 铜权重8%
        # 其他品种...
    }
}

# =============================================================================
# 交易执行参数
# =============================================================================

# 订单管理
ORDER_MANAGEMENT = {
    # 订单类型
    'ORDER_TYPE': 'LIMIT',                  # 订单类型: LIMIT/MARKET
    'USE_IOC': False,                       # 是否使用IOC(立即成交或取消)
    'USE_FOK': False,                       # 是否使用FOK(全部成交或取消)
    
    # 订单执行
    'MAX_ORDER_RETRY': 3,                   # 最大订单重试次数
    'ORDER_RETRY_INTERVAL': 1,              # 订单重试间隔(秒)
    'PRICE_SLIPPAGE': 0.001,                # 价格滑点比例(0.1%)
    
    # 分批建仓
    'BATCH_TRADING': True,                  # 是否分批交易
    'BATCH_SIZE': 3,                        # 分批次数
    'BATCH_INTERVAL': 60,                   # 分批间隔(秒)
}

# 时间控制
TIME_CONTROL = {
    # 交易时间段
    'TRADING_HOURS': {
        'day': ['09:00', '15:00'],          # 日盘交易时间
        'night': ['21:00', '02:30'],        # 夜盘交易时间
    },
    
    # 避免交易的时间段
    'AVOID_TRADING_HOURS': [
        ('11:25', '13:30'),                 # 午间休市
        ('14:55', '21:00'),                 # 日盘收盘到夜盘开盘
    ],
    
    # 特殊日期处理
    'HOLIDAYS': [],                         # 节假日列表
    'PRE_HOLIDAY_CLOSE_HOUR': 14,           # 节前提前收盘时间(小时)
}

# =============================================================================
# 监控和报警参数
# =============================================================================

# 性能监控
PERFORMANCE_MONITORING = {
    # 关键指标阈值
    'MAX_DRAWDOWN_ALERT': 0.1,              # 最大回撤报警阈值(10%)
    'DAILY_LOSS_LIMIT': 0.05,               # 单日最大亏损限制(5%)
    'WEEKLY_LOSS_LIMIT': 0.1,               # 单周最大亏损限制(10%)
    
    # 性能评估周期
    'PERFORMANCE_EVAL_INTERVAL': '1d',      # 性能评估间隔: 1d/1w/1m
    'ROLLING_PERIOD': 30,                   # 滚动计算周期(天)
}

# 报警配置
ALERT_CONFIG = {
    # 报警方式
    'ENABLE_EMAIL_ALERT': False,            # 启用邮件报警
    'ENABLE_SMS_ALERT': False,              # 启用短信报警
    'ENABLE_PUSH_ALERT': True,              # 启用推送报警
    
    # 报警联系人
    'EMAIL_RECIPIENTS': [],                 # 邮件接收人列表
    'PHONE_NUMBERS': [],                    # 短信接收人列表
    
    # 报警内容
    'ALERT_TEMPLATES': {
        'system_error': '系统异常: {error}',
        'risk_alert': '风险报警: {metric}达到阈值{threshold}',
        'performance_alert': '性能报警: {metric}异常',
    }
}

# =============================================================================
# 数据库和存储配置
# =============================================================================

# 数据库配置
DATABASE_CONFIG = {
    # 数据库类型
    'DB_TYPE': 'sqlite',                    # 数据库类型: sqlite/mysql/postgresql
    
    # SQLite配置
    'SQLITE_PATH': 'trading_data.db',       # SQLite数据库文件路径
    
    # MySQL/PostgreSQL配置(如果使用)
    'HOST': 'localhost',
    'PORT': 3306,
    'USERNAME': 'your_username',
    'PASSWORD': 'your_password',
    'DATABASE': 'trading_db',
    
    # 连接池配置
    'POOL_SIZE': 5,                         # 连接池大小
    'MAX_OVERFLOW': 10,                     # 最大溢出连接数
}

# 数据存储
DATA_STORAGE = {
    # 历史数据存储
    'HISTORY_DATA_DAYS': 365,               # 历史数据存储天数
    'TICK_DATA_ENABLED': False,             # 是否存储tick数据
    'MINUTE_DATA_ENABLED': True,            # 是否存储分钟数据
    
    # 数据备份
    'BACKUP_ENABLED': True,                 # 是否启用数据备份
    'BACKUP_INTERVAL': '1d',                # 备份间隔: 1d/1w/1m
    'BACKUP_RETENTION_DAYS': 30,            # 备份保留天数
}

# =============================================================================
# 高级配置(可选)
# =============================================================================

# 机器学习配置(如果使用)
ML_CONFIG = {
    'ENABLE_ML': False,                     # 是否启用机器学习
    'MODEL_TYPE': 'random_forest',          # 模型类型
    'TRAINING_INTERVAL': '1w',              # 模型训练间隔
    'PREDICTION_CONFIDENCE': 0.7,           # 预测置信度阈值
}

# 多策略配置(如果使用)
MULTI_STRATEGY_CONFIG = {
    'ENABLE_MULTI_STRATEGY': False,         # 是否启用多策略
    'STRATEGIES': [],                       # 策略列表
    'STRATEGY_WEIGHTS': {},                 # 策略权重
    'CORRELATION_LIMIT': 0.5,               # 策略间相关性限制
}

# =============================================================================
# 环境特定配置
# =============================================================================

# 开发环境配置
if True:  # 根据实际环境修改条件
    DEBUG_CONFIG = {
        'ENABLE_DEBUG': True,               # 启用调试模式
        'PRINT_TRADES': True,               # 打印交易信息
        'SAVE_DEBUG_DATA': True,            # 保存调试数据
        'TEST_MODE': True,                  # 测试模式
    }

# 生产环境配置
else:
    PRODUCTION_CONFIG = {
        'ENABLE_DEBUG': False,              # 禁用调试模式
        'PRINT_TRADES': False,              # 不打印交易信息
        'SAVE_DEBUG_DATA': False,           # 不保存调试数据
        'TEST_MODE': False,                 # 生产模式
        'ENABLE_AUTO_RESTART': True,        # 启用自动重启
        'RESTART_INTERVAL': 86400,          # 重启间隔(秒)
    }

# =============================================================================
# 配置验证函数
# =============================================================================

def validate_config():
    """验证配置参数的有效性"""
    errors = []
    
    # 检查资金管理参数
    if POSITION_MANAGEMENT['MAX_POSITION_RATIO'] > 1:
        errors.append("MAX_POSITION_RATIO不能大于1")
    
    if RISK_CONTROL['STOP_LOSS_RATIO'] <= 0:
        errors.append("STOP_LOSS_RATIO必须大于0")
    
    # 检查品种配置
    if not SYMBOL_CONFIG['SYMBOLS']:
        errors.append("至少需要配置一个交易品种")
    
    # 检查时间配置
    trading_hours = TIME_CONTROL['TRADING_HOURS']
    if 'day' not in trading_hours or 'night' not in trading_hours:
        errors.append("必须配置日盘和夜盘交易时间")
    
    return errors

# =============================================================================
# 配置工具函数
# =============================================================================

def get_config_summary():
    """获取配置摘要"""
    summary = {
        '交易模式': ACCOUNT_CONFIG['TRADE_MODE'],
        '账户资金': ACCOUNT_CONFIG.get('SIMULATION_BALANCE', '实盘'),
        '交易品种数量': len(SYMBOL_CONFIG['SYMBOLS']),
        '单品种最大仓位': f"{POSITION_MANAGEMENT['MAX_POSITION_RATIO']*100}%",
        '止损比例': f"{RISK_CONTROL['STOP_LOSS_RATIO']*100}%",
        '止盈比例': f"{RISK_CONTROL['TAKE_PROFIT_RATIO']*100}%",
    }
    return summary

def export_config_to_json():
    """将配置导出为JSON格式(用于备份)"""
    import json
    config_dict = {
        'ACCOUNT_CONFIG': ACCOUNT_CONFIG,
        'TECHNICAL_INDICATORS': TECHNICAL_INDICATORS,
        'TRADING_SIGNALS': TRADING_SIGNALS,
        'POSITION_MANAGEMENT': POSITION_MANAGEMENT,
        'RISK_CONTROL': RISK_CONTROL,
        'SYMBOL_SELECTION': SYMBOL_SELECTION,
        'SYMBOL_CONFIG': SYMBOL_CONFIG,
        'ORDER_MANAGEMENT': ORDER_MANAGEMENT,
        'TIME_CONTROL': TIME_CONTROL,
    }
    return json.dumps(config_dict, indent=2, ensure_ascii=False)

# =============================================================================
# 主程序配置检查
# =============================================================================

if __name__ == "__main__":
    # 验证配置
    validation_errors = validate_config()
    if validation_errors:
        print("配置错误:")
        for error in validation_errors:
            print(f"  - {error}")
    else:
        print("配置验证通过!")
    
    # 显示配置摘要
    summary = get_config_summary()
    print("\n配置摘要:")
    for key, value in summary.items():
        print(f"  {key}: {value}")
    
    print("\n请将本文件复制为config.py并根据实际情况修改参数。")